package com.yuw.myUtils;

import org.apache.commons.beanutils.BeanUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyUtils {

    /**
     * 使用SpringMVC框架提供的MultipartFile对象进行文件上传操作
     *
     * @param request            request对象
     * @param objBean            实参数据参数实体类
     * @param multipartFile      文件流对象
     * @param uploadFilePathName 上传文件保存的目录名
     * @param strFilePrefix      上传文件新命名时使用的前缀
     */
    public static void uploadFileByMultipartFile(HttpServletRequest request, Object objBean, MultipartFile multipartFile, String uploadFilePathName, String strFilePrefix) {

        // 新保存文件命名时使用的前缀
        if ("".equals(strFilePrefix)) {
            strFilePrefix = "file";
        }

        // 新保存文件的默认路径名
        if ("".equals(uploadFilePathName)) {
            uploadFilePathName = "uploadFiles" + System.currentTimeMillis();
        }


        /*****************************
         * 文件流对象 multipartFile 进行文件上传处理
         ************************************/
        try {
            //System.out.println("PPPPPP:::::" + request.getContentType());
            // 判断rquest中是否包含了文件流对象(ContentType中是否为 multipart/form-data )
            if (multipartFile != null) {


                // 获取当前服务器的绝对路径
                //System.out.println("request.getContextPath()::::" + request.getContextPath());

                //System.out.println("realpath::::" + request.getServletContext().getRealPath("/"));
                // 服务器发布的项目的存储的真实的物理路径
                // D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\servlet20190528\
                String strBaseRealPath = request.getServletContext().getRealPath("/");
                // 当前保存文件流对象的文件目录
                String strFileSavePath = "static/uploadFiles/" + uploadFilePathName + "/";
                // 根据文件目录的物理地址创建该目录
                File tmpFile = new File(strBaseRealPath + strFileSavePath);
                // 判断文件目录是否存在，如果不存则创建该目录
                if (!tmpFile.exists()) {
                    tmpFile.mkdirs();
                }


                // 对 文件流对象进行上传到服务器操作
                // 获取上传文件的文件后缀
                // 上传文件的原始名字
                String submitFileName = multipartFile.getOriginalFilename();
                System.out.println("multipartFile.getName()::" + multipartFile.getOriginalFilename());
                // 提出文件的后缀
                // 使用正则表达式提取文件的后缀类型
                // 提取后缀的正在表达式
                Pattern pattern = Pattern.compile("\\.\\w+$");
                // 现在创建 matcher 对象
                Matcher matcher = pattern.matcher(submitFileName);
                // 文件类型后缀:默认类型为 .dat
                String strFileType = ".dat";
                if (matcher.find()) {
                    // 获取匹配结果
                    strFileType = matcher.group();
                }

                // 生成新的文件名字：文件名字的格式根据业务需求而定
                // 此处文件名格式： 文件前缀时间毫秒数文件后缀
                String strNewFileName = strFilePrefix + System.currentTimeMillis() + strFileType;

                // 调用part的write方法，将文件流内容写到服务器指定的路径目录下
                // 保存rquest对象中的文件流到服务器指定目录下
                multipartFile.transferTo(new File(strBaseRealPath + strFileSavePath + strNewFileName));
                System.out.println("上传文件保存的本地路径：" + strBaseRealPath + strFileSavePath + strNewFileName);
                // 将文件保存在服务器的相对地址保存到实体类的对象的属性字段
                /*
                 * 因为避免file控件的neme属性值和实体类属性值一样，则会被自动赋值， 要求file控件类的name属性值采用如下格式：file_实体类属性名
                 */
                // getName()获取file控件的name属性值
                String strFilePropertityNameValue = multipartFile.getName();

                // 剔除前缀，获取与实体类对象的属性名
                String strP = strFilePropertityNameValue.replaceFirst("file_", "");
                BeanUtils.setProperty(objBean, strP, strFileSavePath + strNewFileName);

            }
        } catch (Exception e) {
            // 文件上传处理异常
            System.out.println("文件上传处理异常:");
            e.printStackTrace();
        }
    }

    /**
     * 将日期类型转换为指定格式的字符串 注意：格式串的格式和日期字符串的格式要保持一致，否无法进行转换
     *
     * @param strDate   被转化的日期字符串
     * @param strFormat 日期字符串的格式
     * @return 转换之后的日期对象
     */
    public static Date convertString2Date(String strDate, String strFormat) {
        // 返回值（根据业务需求确定默认的返回值）
        // Date date = new Date();
        Date date = null;
        // 如果格式串为空，则使用默认格式串
        if (strFormat == null) {
            strFormat = "yyyy-MM-dd HH:mm:ss";
        }
        if (strDate != null && !strDate.equals("")) {
            // 创建日期格式化处理类的实例对象
            SimpleDateFormat sdf = new SimpleDateFormat(strFormat);
            try {
                // 进行转换处理
                date = sdf.parse(strDate);
            } catch (ParseException e) {
                // 异常处理
                System.out.println("日期字符串转化为日期对象异常：" + e.getMessage());
            }
        }
        return date;

    }

    /**
     * 将日期类型转换为指定格式的字符串
     *
     * @param date      被转化的日期类型
     * @param strFormat 日期字符串的格式
     * @return 转换之后的日期格式串
     */
    public static String convertDate2String(Date date, String strFormat) {

        // 返回值
        String strDate = null;

        if (date != null) {
            // 如果格式串为空，则使用默认格式串
            if (strFormat == null) {
                strFormat = "yyyy-MM-dd HH:mm:ss";
            }
            // 创建日期格式化处理类的实例对象
            SimpleDateFormat sdf = new SimpleDateFormat(strFormat);
            // 进行格式化处理
            strDate = sdf.format(date);
        }
        return strDate;
    }

}
